<?php

namespace app\api\controller;

use app\BaseController;
use think\facade\Db; // 数据库的链接


class Blindbox extends BaseController
{
    /**
     * 抽奖
     */
    public function luckDraw()
    {
        $post = input();
        
        // 获取用户信息
        $UID = request()->UID;
        $user = Db::name('user')->where('id', $UID)->find();
        
        // 数量
        $num = $post['num'];

        if($num <= 0){
            return json(['code' => 500,'msg' => '未知错误!']);
        }

        // 1个金牌抽一次 判断金牌数量是否足够
        if ($num > $user['gold']) {
            return json(['code' => 500,'msg' => '金牌数量不足']);
        }
        // 金牌充足的时候 抽10次 送一个次品
        if($num >= 10){
            $num++;
        }
        // 事务
        Db::startTrans();
        try {
            // 扣除金牌
            // / 记录日志 用户id，金额，类型(0 银牌 1 金牌)，操作类型(0 充值 1 扣除)，备注
            userRecord($UID,$post['num'],1,1,'用户抽奖扣除金牌');
            $data = [];
            for ($i = 0; $i < $num; $i++) {
                // 随机抽奖
                $prize = $this->getPrize();
                // 记录抽奖信息
                $this->getBallRecord($UID, $prize['id']);
                $data[$i]['icon'] = $prize['icon'];
                $data[$i]['name'] = $prize['name'];
            }
            // 提交事务
            Db::commit();
            return json(['code' => 200,'msg' => '抽奖成功', 'data' => $data]);
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return json(['code' => 500,'msg' => '抽奖失败']);
        }
    }

    /**
     * 开奖
     * @param $id 奖品id
     */
    public function getPrize()
    {
        // 获取足球类型 level = 0的
        $ball = Db::name('ball_type')->where('level', 0)->where('del',0)->orderRaw('rand()')->find();
        return $ball;
    }
    /**
     * 足球碎片获得的记录
     */
    public function getBallRecord($uid,$bid,$type = 0,$remarks = 'app抽奖获得')
    {
        $data = [
            'uid' => $uid,
            'bid' => $bid,
            'obtain_time' => time(),
            'type' => $type,
            'remarks' => $remarks,
        ];
        Db::name('ball_debris')->insert($data);
    }

    // 获取奖品列表
    public function getPrizeList()
    {
        $uid = request()->UID;

        // 查询用户的碎片 通过bid做分组显示数量
        $list = Db::name('ball_debris')->where('uid', $uid)->group('bid')->where('is_status',0)->field('bid,count(*) as num')->select()->toArray();
        foreach ($list as $key => $value) {
            $prize_list = Db::name('ball_type')->field('name,icon')->where('id', $value['bid'])->find();
            $list[$key]['name'] = $prize_list['name'];
            $list[$key]['icon'] = $prize_list['icon'];
        }
        return json(['code' => 200,'msg' => '获取成功', 'data' => $list]);
    }

    // 碎片合成足球接口
    public function combine()
    {
        $post = input();
        $uid = request()->UID;
        $bid = $post['bid'];

        if (empty($bid)) {
            return json(['code' => 500,'msg' => '对应的足球!']);
        }

        // 查询用户的碎片数量
        $ball_num = Db::name('ball_debris')->where('uid', $uid)->where('is_status',0)->where('bid', $bid)->count();
        // 足球信息
        $ball = Db::name('ball_type')->where('id', $bid)->find();
        // 因为一个球只能合成一次 所有要查询当前球是否存在

        $ball_user = Db::name('ball_user')->where('uid', $uid)->where('bid', $bid)->where('is_status',0)->find();

        if (!empty($ball_user)) {
            return json(['code' => 500,'msg' => '该球已经合成过了']);
        }

        if ($ball_num < $ball['debris']) {
            return json(['code' => 500,'msg' => '碎片数量不足']);
        }
        // 事务
        Db::startTrans();
        try {
            // 新增用户足球信息 ball_user
            $data_ball_user = [
                'uid' => $uid,
                'bid' => $bid,
                'blevel' => $ball['level'],
                'obtain_time' => time(),
            ];
            $buid = Db::name('ball_user')->insertGetId($data_ball_user);
        
            // 修改碎片状态 随机修改$ball['debris']条
            // 用户ID  球ID  数量   备注 合成后的球ID
            $this->useRecord($uid,$bid,$ball['debris'],'app合成足球',$buid);
            
            // 提交事务
            Db::commit();
            return json(['code' => 200,'msg' => '合成'.$ball['name'].'足球成功']);
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return json(['code' => 500,'msg' => '合成失败']);
        }
    }

    // 终极足球合成接口
    public function endCombine()
    {
        $uid = request()->UID;

        // 查询用户下的足球数量
        $ball_num = Db::name('ball_user')->where('uid', $uid)->where('is_status',0)->where('blevel',0)->count();

        // 查询终极足球的信息
        $end_ball = Db::name('ball_type')->where('level', 1)->where('del', 0)->find();
        if ($ball_num < $end_ball['debris']) {
            return json(['code' => 500,'msg' => '足球数量不足']);
        }

        // 查询用户是否有终极足球
        $ball_user = Db::name('ball_user')->where('uid', $uid)->where('blevel',1)->where('is_status',0)->find();
        
        if (!empty($ball_user)) {
            return json(['code' => 500,'msg' => '该球已经合成过了']);
        }

        // 事务
        Db::startTrans();
        try {
            // 新增用户终极足球信息 ball_user
            $data_ball_user = [
                'uid' => $uid,
                'bid' => $end_ball['id'],
                'blevel' => $end_ball['level'],
                'obtain_time' => time(),
            ];

            $buid = Db::name('ball_user')->insertGetId($data_ball_user);
            // 更新用户普通足球的数据 状态

            Db::name('ball_user')->where('uid', $uid)->where('blevel',0)->where('is_status',0)->update(['is_status' => 1]);
            // 提交事务
            Db::commit();
            return json(['code' => 200,'msg' => '合成'.$ball['name'].'足球成功']);
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return json(['code' => 500,'msg' => '合成失败']);
        }
    }

    // 碎片赠送
    public function give()
    {
        $post = input();
        $uid = request()->UID;
        $bid = $post['bid'];
        $num = $post['num'];
        $sid = $post['sid'];

        if($num <= 0){
            return json(['code' => 500,'msg' => '数量错误!']);
        }

        // 查询当前用户待使用的碎片数量
        $ball_num = Db::name('ball_debris')->where('uid', $uid)->where('is_status',0)->where('bid', $bid)->count();
        if ($ball_num < $num) {
            return json(['code' => 500,'msg' => '碎片数量不足']);
        }

        // 获取用户是否存在
        $user = Db::name('user')->where('id', $sid)->find();
        if (empty($user)) {
            return json(['code' => 500,'msg' => '用户不存在']);
        }


        // 事务
        Db::startTrans();
        try {
            for ($i = 0; $i < $num; $i++) {
                $this->getBallRecord($sid,$bid,1,'来自用户ID:'.$uid.'的赠送');
            }
            
            // 用户ID  球ID  数量   备注
            $this->useRecord($uid,$bid,$num,'赠送给用户ID:'.$sid);
            // 提交事务
            Db::commit();
            return json(['code' => 200,'msg' => '赠送成功']);
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return json(['code' => 500,'msg' => '赠送失败']);
        }
    }
    // 使用碎片更新记录
    public function useRecord($uid,$bid,$num,$remarks='app使用',$buid=0)
    {
        $ball_list = Db::name('ball_debris')->where('uid', $uid)->where('bid', $bid)->where('is_status',0)->limit($num)->select()->toArray();

        foreach ($ball_list as $key => $value) {
            $data = [
                'is_status' => 1,
                'usage_time' => time(),
                'buid' => 0,
                'remark' => $remarks,
                'buid' => $buid,
            ];
            Db::name('ball_debris')->where('id', $value['id'])->update($data);
        }
    }

    // 获取已有足球列表
    public function getBallList()
    {
        $uid = request()->UID;
        $list = Db::name('ball_user')
        ->alias('bu')
        ->join('ball_type bt', 'bu.bid = bt.id')
        ->where('bu.blevel',0)
        ->where('bu.uid', $uid)->where('bu.is_status',0)
        ->select()
        ->toArray();
        $lists = Db::name('ball_user')
        ->alias('bu')
        ->join('ball_type bt', 'bu.bid = bt.id')
        ->where('bu.blevel',1)
        ->where('bu.uid', $uid)->where('bu.is_status',0)
        ->select()
        ->toArray();
        return json(['code' => 200,'msg' => '获取成功', 'data' => array('list' => $list,'lists' => $lists)]);
    }
}